<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 防抖 延迟函数执行 重复触发 则清除之前的记时   等够时间 了 就执行一次
      // 场景 输入框 自动搜索    监听窗口变化去重新 布局
      function debounce(fn, time) {
        if (typeof fn !== 'function') {
          throw Error();
        }
        let timerId;
        return function (...args) {
          if (timerId) {
            clearTimeout(timerId);
          }
          timerId = setTimeout(() => {
            fn.call(this, ...args);
          }, time);
        };
      }

      // 函数节流 函数节流，指一定时间内函数只执行一次
      // 场景 按钮点击 单位时间内 只执行一次  监听滚动事件，比如是否滑到底部自动加载更多，用throttle来判断
      // 1.时间戳 形式
      // 会立即执行一次
      function throttle(fn, time) {
        let preTime = 0;
        return function (...args) {
          let now = new Date();
          if (now - preTime > time) {
            fn.call(this, ...args);
            pre = now;
          }
        };
      }

      // 2.计时器 实现
      // 会立即执行一次
      function throttle(fn, time) {
        let timerId;
        return function (...args) {
          if (!timerId) {
            fn.call(this, ...args);
            timerId = setTimeout(() => {
              timerId = null;
            }, time);
          }
        };
      }
    </script>
  </body>
</html>
